/*
 * Copyright (c) 2007-2020 西安交通信息投资营运有限公司 版权所有
 */

package com.xci.edu.core.service;

import com.github.lvyanyang.annotation.OperateLog;
import com.github.lvyanyang.core.BoolResult;
import com.github.lvyanyang.core.PageList;
import com.github.lvyanyang.core.XCI;
import com.github.lvyanyang.sys.core.BaseSysService;
import com.xci.edu.core.dao.ExamPreDao;
import com.xci.edu.core.entity.ExamPre;
import com.xci.edu.core.entity.ExamPreExtend;
import com.xci.edu.core.entity.ExamRecord;
import com.xci.edu.core.filter.ExamPreFilter;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 考试预约服务
 * @author 马星俊 maxingjun@xci96716.com
 * @since 2020-11-24 18:00:15
 */
@Service
public class ExamPreService extends BaseSysService {
    /** 考试预约数据层对象 */
    @Resource private ExamPreDao examPreDao;

    /**
     * 新建考试预约
     * @param entity 考试预约实体
     */
    @OperateLog(msg = "新建考试预约", module = "考试预约")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult insert(ExamPre entity) {
        return save(entity, true);
    }

    /**
     * 修改考试预约
     * @param entity 考试预约实体
     */
    @OperateLog(msg = "修改考试预约", module = "考试预约")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult update(ExamPre entity) {
        return save(entity, false);
    }

    /**
     * 修改考试预约状态
     * @param ids    考试预约主键字符串
     * @param status 考试预约状态
     */
    @OperateLog(msg = "修改考试预约状态", module = "考试预约")
    @Transactional(rollbackFor = Exception.class)
    public void updateStatus(@NotBlank(message = "请指定考试预约主键字符串") String ids, @NotNull(message = "请指定考试预约状态") Boolean status) {
        XCI.forEachIds(ids, id -> {
            examPreDao.updateStatus(id, status);
        });
    }

//    /**
//     * 批量保存考试预约
//     * @param entities 考试预约实体集合
//     */
//    @OperateLog(msg = "修改考试预约", module = "考试预约")
//    @Transactional(rollbackFor = Exception.class)
//    public void batchSave(List<ExamPre> entities) {
//        for (ExamPre entity : entities) {
//            if (entity.getId() == null || !examPreDao.existById(entity.getId())) {
//                //无主键或者主键在数据库中不存在,则新建;
//                self.save(entity, true).ifFailThrow();
//            } else {
//                //其他情况,则修改
//                self.save(entity, false).ifFailThrow();
//            }
//        }
//    }

    /**
     * 删除考试预约
     * @param ids 考试预约主键字符串
     */
    @OperateLog(msg = "删除考试预约", module = "考试预约")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult delete(@NotBlank(message = "请指定考试预约主键字符串") String ids) {
        XCI.forEachIds(ids, id -> {
            var entity = examPreDao.selectById(id);
            if (entity == null) return;

            examPreDao.deleteById(entity.getId());
            logService.saveDeleteHistoryLogAsync(entity.getId(), entity);
        });
        return BoolResult.success();
    }


    /**
     * 根据主键查询单个考试预约
     * @param id 考试预约主键
     * @return 返回考试预约实体
     */
    public ExamPreExtend selectById(@NotNull(message = "请指定考试预约主键") Long id) {
        return examPreDao.selectById(id);
    }

    /**
     * 根据学员主键查询当前时间所有的考试预约记录
     * @param studentId 学员主键
     * @return 返回考试记录实体
     */
    public List<ExamPre> selectByStudentId(@NotNull(message = "请指定学员主键") Long studentId) {
        return examPreDao.selectByStudentId(studentId);
    }

    /**
     * 查询考试预约列表
     * @param filter 过滤条件
     * @return 返回考试预约列表
     */
    public List<ExamPreExtend> selectList(ExamPreFilter filter) {
        return examPreDao.selectList(filter);
    }

    /**
     * 查询考试预约分页列表
     * @param filter 过滤条件
     * @return 返回考试预约分页列表
     */
    public PageList<ExamPreExtend> selectPageList(ExamPreFilter filter) {
        return PageList.of(examPreDao.selectPageList(filter));
    }

    /**
     * 保存数据,在insert和update之前和之后的校验和处理
     * @param entity  考试预约实体
     * @param created 是否新建
     */
    private BoolResult save(ExamPre entity, boolean created) {
        //新建时如果主键未指定,自动设置主键
        XCI.ifTrueAction(XCI.invalidId(entity.getId(), created), () -> entity.setId(XCI.nextId()));
        //更新数据库
        if (created) {
            entity.setOperateDateTime(XCI.now());
            examPreDao.insert(entity);
            logService.saveInsertHistoryLogAsync(entity.getId(), entity);
        } else {
            var before = examPreDao.selectById(entity.getId());
            entity.setOperateDateTime(XCI.now());
            examPreDao.update(entity);
            logService.saveUpdateHistoryLogAsync(entity.getId(), before, entity);
        }
        return BoolResult.success();
    }
}